home *** CD-ROM | disk | FTP | other *** search
/ Java Interactive Reference Guide / Java Interactive Reference Guide.iso / autorun / source.dir / 00104_15.txt < prev    next >
Encoding:
Text File  |  1980-01-11  |  5.2 KB  |  178 lines

  1. /*
  2.  * @(#)RoundButtonFilter.java    1.3 95/10/13  
  3.  *
  4.  * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
  8.  * without fee is hereby granted. 
  9.  * Please refer to the file http://java.sun.com/copy_trademarks.html
  10.  * for further important copyright and trademark information and to
  11.  * http://java.sun.com/licensing.html for further important licensing
  12.  * information for the Java (tm) Technology.
  13.  * 
  14.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  15.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  16.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  17.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  18.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  19.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  20.  * 
  21.  * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
  22.  * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
  23.  * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
  24.  * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
  25.  * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
  26.  * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
  27.  * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
  28.  * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
  29.  * HIGH RISK ACTIVITIES.
  30.  */
  31.  
  32. /**
  33.  * An extensible ImageMap applet class.
  34.  * The active areas on the image are controlled by ImageArea classes
  35.  * that can be dynamically loaded over the net.
  36.  *
  37.  * @author     Jim Graham
  38.  * @version     1.3, 10/13/95
  39.  */
  40. class RoundButtonFilter extends ButtonFilter {
  41.     int Xcenter;
  42.     int Ycenter;
  43.     int Yradsq;
  44.     int innerW;
  45.     int innerH;
  46.     int Yrad2sq;
  47.  
  48.     public RoundButtonFilter(boolean press, int p, int b, int w, int h) {
  49.     super(press, p, b, w, h);
  50.     Xcenter = w/2;
  51.     Ycenter = h/2;
  52.     Yradsq = h * h / 4;
  53.     innerW = w - border * 2;
  54.     innerH = h - border * 2;
  55.     Yrad2sq = innerH * innerH / 4;
  56.     }
  57.  
  58.     public boolean inside(int x, int y) {
  59.     int yrel = Math.abs(Ycenter - y);
  60.     int xrel = (int) (Math.sqrt(Yradsq - yrel * yrel) * width / height);
  61.     return (x >= Xcenter - xrel && x < Xcenter + xrel);
  62.     }
  63.  
  64.     public void buttonRanges(int y, int ranges[]) {
  65.     int yrel = Math.abs(Ycenter - y);
  66.     int xrel = (int) (Math.sqrt(Yradsq - yrel * yrel) * width / height);
  67.     int xslash = width - (y * width / height);
  68.     ranges[0] = 0;
  69.     ranges[1] = Xcenter - xrel;
  70.     ranges[6] = Xcenter + xrel;
  71.     ranges[7] = width;
  72.     if (y < border) {
  73.         ranges[2] = ranges[3] = ranges[4] = Xcenter;
  74.         ranges[5] = ranges[6];
  75.     } else if (y + border >= height) {
  76.         ranges[2] = ranges[1];
  77.         ranges[3] = ranges[4] = ranges[5] = Xcenter;
  78.     } else {
  79.         int xrel2 = (int) (Math.sqrt(Yrad2sq - yrel * yrel)
  80.                    * innerW / innerH);
  81.         ranges[3] = Xcenter - xrel2;
  82.         ranges[4] = Xcenter + xrel2;
  83.         if (y < Ycenter) {
  84.         ranges[2] = ranges[3];
  85.         ranges[5] = ranges[6];
  86.         } else {
  87.         ranges[2] = ranges[1];
  88.         ranges[5] = ranges[4];
  89.         }
  90.     }
  91.     }
  92.  
  93.     private int savedranges[];
  94.     private int savedy;
  95.  
  96.     private synchronized int[] getRanges(int y) {
  97.     if (savedranges == null || savedy != y) {
  98.         if (savedranges == null) {
  99.         savedranges = new int[8];
  100.         }
  101.         buttonRanges(y, savedranges);
  102.         savedy = y;
  103.     }
  104.     return savedranges;
  105.     }
  106.  
  107.     public int filterRGB(int x, int y, int rgb) {
  108.     boolean brighter;
  109.     int percent;
  110.     int i;
  111.     int xrel, yrel;
  112.     int ranges[] = getRanges(y);
  113.     for (i = 0; i < 7; i++) {
  114.         if (x >= ranges[i] && x < ranges[i+1]) {
  115.         break;
  116.         }
  117.     }
  118.     switch (i) {
  119.     default:
  120.     case 0:
  121.     case 6:
  122.         return rgb & 0x00ffffff;
  123.     case 1:
  124.         brighter = !pressed;
  125.         percent = defpercent;
  126.         break;
  127.     case 5:
  128.         brighter = pressed;
  129.         percent = defpercent;
  130.         break;
  131.     case 2:
  132.         yrel = y - Ycenter;
  133.         xrel = Xcenter - x;
  134.         percent = (int) (yrel * defpercent * 2 /
  135.                  Math.sqrt(yrel * yrel + xrel * xrel))
  136.         - defpercent;
  137.         if (!pressed) {
  138.         percent = -percent;
  139.         }
  140.         if (percent == 0) {
  141.         return rgb;
  142.         } else if (percent < 0) {
  143.         percent = -percent;
  144.         brighter = false;
  145.         } else {
  146.         brighter = true;
  147.         }
  148.         break;
  149.     case 4:
  150.         yrel = Ycenter - y;
  151.         xrel = x - Xcenter;
  152.         percent = (int) (yrel * defpercent * 2 /
  153.                  Math.sqrt(yrel * yrel + xrel * xrel))
  154.         - defpercent;
  155.         if (pressed) {
  156.         percent = -percent;
  157.         }
  158.         if (percent == 0) {
  159.         return rgb;
  160.         } else if (percent < 0) {
  161.         percent = -percent;
  162.         brighter = false;
  163.         } else {
  164.         brighter = true;
  165.         }
  166.         break;
  167.     case 3:
  168.         if (!pressed) {
  169.         return rgb & 0x00ffffff;
  170.         }
  171.         brighter = false;
  172.         percent = defpercent;
  173.         break;
  174.     }
  175.     return filterRGB(rgb, brighter, percent);
  176.     }
  177. }
  178.